<?php
/**
 * Classe para abstração de URLs. Processa também URLs virtuais do FrameWork
 *
 */
class URL
{
	protected $url;
	protected $arrURL;
	protected $arrQuery;
	protected $arrParams;
	
	/**
	 * Context
	 *
	 * @var Context
	 */
	protected $context;
	
	/**
	 * URL
	 *
	 * @param string $url
	 * @return URL
	 */
	public function URL($url = '')
	{
		$this->url = $url;
		if (class_exists('Context'))
		{
			$this->context = Context::getInstance();
		}
	}
	
	/**
	 * Adicionar parametro à URL
	 * ex: module:foo.bar?name=value
	 *
	 * @param string $name
	 * @param string $value
	 */
	public function addParam($name, $value)
	{
		$this->arrParams[$name] = $value;
	}
	
	/**
	 * Retirar parametro da url
	 *
	 * @param string $name
	 */
	public function removeParam($name)
	{
		unset($this->arrParams[$name]);
	}
	
	/**
	 * Configurar o context
	 *
	 * @param Context $context
	 */
	public function setContext($context)
	{
		$this->context = $context;
	}
	
	/**
	 * Converte o URL em partes num array
	 *
	 */
	protected function parse()
	{
		$this->arrURL = @parse_url($this->url);
		$urlQueryArray = explode('&', $this->arrURL['query']);
		foreach ($urlQueryArray as $params)
		{
			$paramsArray = explode('=', $params);
			$this->arrQuery[$paramsArray[0]] = $paramsArray[1];
		}
	}
	
	/**
	 * Obtem o valor de um parametro da query da URL
	 *
	 * @param string $name
	 * @return mixed
	 */
	public function getParam($name)
	{
		if (!$this->arrURL)
		{
			$this->parse();
		}
		return $this->arrQuery[$name];
	}
	
	/**
	 * Obtem o host da URL
	 * ex: http://localhost/file.php
	 * Rretorna: localhost
	 * 
	 * @return string
	 */
	public function getHost()
	{
		if (!$this->arrURL)
		{
			$this->parse();
		}
		return $this->arrURL['host'];
	}
	
	/**
	 * Obtem o arquivo e os parametros da URL
	 * ex: http://localhost/file.php?param=value
	 * Rretorna: file.php?param=value
	 * 
	 * @return string
	 */
	public function getFileAndQuery()
	{
		if (!$this->arrURL)
		{
			$this->parse();
		}
		if ($this->arrURL['query'])
		{
			return $this->arrURL['path'] . '?' . $this->arrURL['query'];
		}
		return $this->arrURL['path'];
	}
	
	/**
	 * Obtem a url completa
	 * Para processar url do xmlnuke configure o context e passe TRUE para este método
	 *
	 * @param bool $parse
	 * @return string
	 */
	public function getFullUrl($parse = true)
	{
		$strUrl = $this->url;
		if ($this->arrParams)
		{
			$strSep = '?';
			if (strpos($strUrl, '?') !== false)
			{
				$strSep = '&';
			}
			foreach ($this->arrParams as $name => $value)
			{
				$strUrl .= $strSep . $name . '=' . $value;
				$strSep = '&';
			}
		}
		if (!$parse || !$this->context)
		{
			return $strUrl;
		}
		$strUrl = ParamProcessor::Process($strUrl);
//		$strUrl = str_replace('&', '&amp;', $strUrl);
		return $strUrl;
	}
	
	/**
	 * Obtem a url transformada
	 * ex: module:foo.bar -> x.php?m=foo.bar&site=sample
	 *
	 * @return string
	 */
	public function get()
	{
		return $this->getFullUrl(true);
	}
	
	/**
	 * Processa uma url
	 * verifica se a variavel é uma string uma instancia da classe URL para obter a url
	 *
	 * @param mixed $var
	 * @return string
	 */
	public static function getUrl($var)
	{
		if (is_a($var, 'URL'))
		{
			return $var->getFullUrl(true);
		}
		return $var;
	}
}
?>